package pruebas.naves;

import org.junit.*;
import static org.junit.Assert.*;
import static modelo.SetUps.*;
import modelo.Movil;
import modelo.armas.Balas;
import modelo.armas.RadarEnemigo;
import modelo.desplazadores.DesplazadorZigZag;
import modelo.naves.Bombardero;
import modelo.naves.EnergiaAgotadaException;
import modelo.naves.NaveAlgo42;
import modelo.util.Vector;

public class TestBombardero {
	private Vector p1 = new Vector (0,0);//una posicion donde crear la nave
	private Vector p2 = new Vector (1,0);//hacia donde se tiene que mover
	private Bombardero unBombardero;

	@Before
	public void setUp() throws Exception {
		unBombardero = new Bombardero(p1, p2);
	}

	@Test
	public void testInicializacion() {
		assertEquals("inicializacion incorrecta de posicion en bombardero",
				p1, unBombardero.getPosicion());
		assertEquals("inicializacion incorrecta de posicion en bombardero",
				ENERGIA_BOMBARDERO, unBombardero.getEnergia());
	}
	
	@Test
	public void testMovimiento(){
		//para chequear el movimiento utilizo el desplazador Zig Zag
		DesplazadorZigZag desplazador = new DesplazadorZigZag (p1, p2, VELOCIDAD_BOMBARDERO);
		for (int i = 0; i < 5; i++){
			unBombardero.mover();
			desplazador.mover();
			assertEquals("movimiento incorrecto en bombardero, al mover mas de una vez",
					desplazador.getPosicion(), unBombardero.getPosicion());
		}
	}
	
	
	@Test (expected = EnergiaAgotadaException.class)
	public void testDanio(){
		//aplico al bombardero un danio mayor a su energia
		unBombardero.recibirDisparo(ENERGIA_BOMBARDERO+5);
		assertEquals("energia bombardero no se descuenta adecuadamente",
				(-5), unBombardero.getEnergia());
		assertFalse("bombardero no debe permitir seguir actuando con su energia agotada",
				unBombardero.seguirActuando());
		//al intentar moverse debe lanzar una excepcion
		unBombardero.mover();
	}
	
	@Test 
	public void testDisparar(){
		// debe devolver un RadarEnemigo
		RadarEnemigo unRadar = (RadarEnemigo)unBombardero.disparar();
		NaveAlgo42 algo42 = new NaveAlgo42 (p1,p2);
		int energiaAntesDelChoque = algo42.getEnergia();
		unRadar.chocarCon(algo42);
		//el radar no debe seguir actuando
		assertFalse ("el radar debe impactar con el algo42",
				unRadar.seguirActuando());
		//el algo 42 no debe ser afectado
		assertEquals ("el radar no debe afectar al algo42",
				energiaAntesDelChoque, algo42.getEnergia());
	}
	
	@Test
	public void testCambioDeArma(){
		//primero debe disparar un torpedo rastreador
		Movil movil = unBombardero.disparar();
		assertEquals(movil.getClass() , RadarEnemigo.class);
		for (int i = 0; i < CARGA_TORPEDO_SIMPLE; i++){
			movil = unBombardero.disparar();
		}
		//al disparar una vez mas debe cambiar a cohete
		assertEquals(((Balas)movil).getAlcance(), ALCANCE_COHETE);
		
		
	}
}
